﻿using SuperWebSocket;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace IDCardReader
{
    public class WebSocketManager
    {
        readonly static Dictionary<string, WebSocketSession> sessionDics = new Dictionary<string, WebSocketSession>();
        static WebSocketServer webSocketServer;
        static Main _from;
        public static void Init(Main form)
        {
            // var ip = GetLocalIP();
            webSocketServer = new WebSocketServer();
            _from = form;
            var isSetup = webSocketServer.Setup("::", 8888);
            //  Common.LogHelper.WriteError("WebSocketManager： 服务器端启动" + (isSetup ? "成功" : "失败"));
            new Action(() =>
            {
                _from.WriteLog(string.Format(@"WebSocketManager： 服务器端启动" + (isSetup ? "成功" : "失败")));
            }).Invoke();
            if (!isSetup)
                return;

            webSocketServer.NewSessionConnected += WebSocketServer_NewSessionConnected;
            webSocketServer.SessionClosed += WebSocketServer_SessionClosed;
            webSocketServer.NewMessageReceived += WebSocketServer_NewMessageReceived;

            var isStart = webSocketServer.Start();
            new Action(() =>
            {
                _from.WriteLog(string.Format(@"WebSocketManager： 服务器端侦听" + (isSetup ? "成功" : "失败")));
            }).Invoke(); // Common.LogHelper.WriteError("WebSocketManager： 服务器端侦听" + (isStart ? "成功" : "失败"));
        }

        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="session"></param>
        /// <param name="value"></param>
        private static void WebSocketServer_NewMessageReceived(WebSocketSession session, string value)
        {
            // Common.LogHelper.WriteError("WebSocketManager： 接收消息 \r\n" + value);
            new Action(() =>
            {
                _from.WriteLog(string.Format(@"WebSocketManager： 接收消息 \r\n" + value));
            }).Invoke();

            if (!string.IsNullOrWhiteSpace(value))
            {
                if (!sessionDics.ContainsKey(value))
                    sessionDics.Add(value, session);
                else
                    sessionDics[value] = session;

            }
        }

        /// <summary>
        /// 下线
        /// </summary>
        /// <param name="session"></param>
        /// <param name="value"></param>
        private static void WebSocketServer_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
        {
            new Action(() =>
            {
                _from.WriteLog(string.Format(@"WebSocketManager：{0} {1}下线", value, session.RemoteEndPoint));
            }).Invoke();  // Common.LogHelper.WriteError(string.Format("WebSocketManager：{0} {1}下线", value, session.RemoteEndPoint));
        }

        /// <summary>
        /// 上线
        /// </summary>
        /// <param name="session"></param>
        private static void WebSocketServer_NewSessionConnected(WebSocketSession session)
        {
            new Action(() =>
            {
                _from.WriteLog(string.Format(@"WebSocketManager：{0} 上线", session.RemoteEndPoint));
            }).Invoke();
            // Common.LogHelper.WriteError(string.Format("WebSocketManager：{0}上线", session.RemoteEndPoint));
        }

        /// <summary>
        /// 发送消息到客户端
        /// </summary>
        /// <param name="value"></param>
        /// <param name="msg"></param>
        public static void SendMsgToRemotePoint(string value, string msg)
        {
            if (sessionDics.ContainsKey(value))
            {
                var webSocketSession = sessionDics[value];
                if (webSocketSession != null)
                {
                    webSocketSession.Send(msg);
                }
            }
        }


        ///// <summary>
        ///// 获取本地IP等信息
        ///// </summary>
        ///// <returns></returns>
        //public static string GetLocalIP()
        //{
        //    //本机IP地址 
        //    string strLocalIP = "";
        //    //得到计算机名 
        //    string strPcName = Dns.GetHostName();
        //    //得到本机IP地址数组 
        //    IPHostEntry ipEntry = Dns.GetHostEntry(strPcName);
        //    //遍历数组 
        //    foreach (var IPadd in ipEntry.AddressList)
        //    {
        //        //判断当前字符串是否为正确IP地址 
        //        if (IsRightIP(IPadd.ToString()))
        //        {
        //            //得到本地IP地址 
        //            strLocalIP = IPadd.ToString();
        //            //结束循环 
        //            break;
        //        }
        //    }

        //    //返回本地IP地址 
        //    return strLocalIP;
        //}
        ///// <summary>
        ///// 判断是否为正确的IP地址
        ///// </summary>
        ///// <param name="strIPadd">需要判断的字符串</param>
        ///// <returns>true = 是 false = 否</returns>
        //private static bool IsRightIP(string strIPadd)
        //{
        //    //利用正则表达式判断字符串是否符合IPv4格式
        //    if (Regex.IsMatch(strIPadd, "[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"))
        //    {
        //        //根据小数点分拆字符串
        //        string[] ips = strIPadd.Split('.');
        //        if (ips.Length == 4 || ips.Length == 6)
        //        {
        //            //如果符合IPv4规则
        //            if (System.Int32.Parse(ips[0]) < 256 && System.Int32.Parse(ips[1]) < 256 & System.Int32.Parse(ips[2]) < 256 & System.Int32.Parse(ips[3]) < 256)
        //                //正确
        //                return true;
        //            //如果不符合
        //            else
        //                //错误
        //                return false;
        //        }
        //        else
        //            //错误
        //            return false;
        //    }
        //    else
        //        //错误
        //        return false;
        //}
    }
}
